package org.aplombh.java.interview.ms;

import java.util.Arrays;
import java.util.TreeMap;

/*

请回答下面10个问题：
1、第一个答案是b的问题是哪一个？

（a）2；（b） 3；（c）4；（d）5；（e）6

2、唯一的连续两个具有相同答案的问题是：

（a）2，3；（b）3，4；（c）4，5；（d）5，6；（e）6，7；

3、本问题答案和哪一个问题的答案相同？

（a）1；（b）2；（c）4；（d）7；（e）6

4、答案是a的问题的个数是：

（a）0；（b）1；（c）2；（d）3；（e）4

5、本问题答案和哪一个问题的答案相同？

（a）10；（b）9；（c）8；（d）7；（e）6

6、答案是a的问题的个数和答案是什么的问题的个数相同？

（a）b；（b）c；（c）d；（d）e；（e）以上都不是

7、按照字母顺序，本问题的答案和下一个问题的答案相差几个字母？

（a）4；（b）3；（c）2；（d）1；（e）0。

8、答案是元音字母的问题的个数是：

（a）2；（b）3；（c）4；（d）5；（e）6。

9、答案是辅音字母的问题的个数是：

（a）一个质数；（b）一个阶乘数；（c）一个平方数；（d）一个立方数，（e）5的倍数

10、本问题的答案是：

（a）a；（b）b；（c）c；（d）d；（e）e

*/

public class MS {
    /**
     * @param args
     */
    public static void main(String[] args) {

        MyAns ma = new MyAns();
        //System.out.println(ma.ans);
        //ma.get5(9765624,9);
        //ma.showAns();
        ma.show();
    }
}

class MyAns {

    int[] ans = new int[10];//答案的数字化数组
    TreeMap<Integer, Integer> tm;//存储每一个答案出现的次数，比如a出现几次，b出现几次
    int[][] ques = {//数字化每一道题目，题目的编号从0开始计算，方便数组遍历。
            //同理，答案a,b,c,d,e也从0开始计算。
            {1, 2, 3, 4, 5},//0
            {1, 2, 3, 4, 5},//1
            {0, 1, 3, 6, 5},//2
            {0, 1, 2, 3, 4},//3
            {9, 8, 7, 6, 5},//4
            {1, 2, 3, 4, 5},//5
            {4, 3, 2, 1, 0},//6
            {2, 3, 4, 5, 6},//7
            {0, 1, 2, 3, 4},//8
            {0, 1, 2, 3, 4}};//9


    public void show() {//解决问题的核心部分。
        System.out.println("start");
        for (int i = 0; i < 9765625; i++) {//遍历每一种情况的可能性
            get5(i, 9);
            tm = showMap(ans);
            //showAns();
            int num8 = mget(1) + mget(2) + mget(3);
            if ((firB() == ques[0][ans[0]])
                    && (sec() == ques[1][ans[1]])
                    && (ans[2] == ans[ques[2][ans[2]]])
                    && (mget(0) == ques[3][ans[3]])
                    && (ans[4] == ans[ques[4][ans[4]]])
                    && (isFive(ques[5][ans[5]]))
                    && (Math.abs(ans[6] - ans[7]) == ques[6][ans[6]])
                    && (mget(0) + mget(4) == ques[7][ans[7]])
                    && (isEight(num8, ques[8][ans[8]]))
                    && (ans[9] == ques[9][ans[9]])) {//判断每一种可能性的每一道题目是否符合答案
                showAns();//打印出满足所有题目的答案数组
            }

        }
        System.out.println("end");
    }

    public void showAns() {//打印出答案的数组
        Character[] chs = new Character[10];
        for (int i = 0; i < 10; i++) {
            chs[i] = (char) (ans[i] + 'a');
        }

        System.out.println(Arrays.asList(chs).toString());
    }

    public TreeMap<Integer, Integer> showMap(int[] ins) {//把已知数组装到map中
        //存储每一个答案出现的次数，比如a出现几次，b出现几次
        TreeMap<Integer, Integer> tm = new TreeMap<Integer, Integer>();

        for (int c : ins) {
            Integer value = tm.get(c);
            if (value == null)
                value = 0;
            value++;
            tm.put(c, value);
        }

        return tm;
    }

    public void get5(int num, int count) {//把十进制转换为五进制，存到int数组中，得到的就是
        //每一道题目的答案值(0=a,1=b,2=c,3=d,4=e).
        int x = num / 5;
        if (x > 0) {
            get5(x, count - 1);
        }
        ans[count] = num % 5;
        //System.out.println(ans[count]);
    }

    public int firB() {//第一个答案是b的问题是哪一个
        for (int i = 0; i < 10; i++) {
            if (ans[i] == 1)
                return i;
        }
        return -1;
    }

    public int sec() {//返回第一个 两个答案相同的 数值
        int count = 0;
        int x = -1;
        for (int i = 0; i < 9; i++) {
            if (ans[i] == ans[i + 1]) {//连续2个问题的答案相同
                count++;//确保个数唯一
                x = i;
            }
        }

        if (!(count == 1))//判断唯一的一个
            return -1;//不唯一的情况
        else
            return x;//唯一的情况
    }

    public boolean isEight(int num, int in) {
        int[][] num8s = {{2, 3, 5, 7},//一个质数的可能性
                {1, 2, 6},//一个阶数的可能性
                {1, 4, 9},//一个平方数的可能性
                {1, 8},//一个立方数的可能性
                {0, 5}}; //5的倍数的可能性。

        int[] ints = num8s[in];
        for (int i : ints) {
            if (num == i)
                return true;
        }
        return false;
    }

    public boolean isFive(int num) {//角标5号的问题，需要分情况判断
        if (num < 5)//答案是前4个的情况
            return mget(0) == mget(ques[5][ans[5]]);
        else {//以上都不是的情况
            for (int i = 1; i < 5; i++) {
                if (mget(0) == mget(i))
                    return false;
            }
            return true;
        }
    }

    public int mget(Integer i) {//封装tm的get()方法 返回值为null的情况，
        //否则，null与数字不能相加，也不能用于 == 的判断。
        if (tm.get(i) == null)
            return 0;
        return tm.get(i);

    }
}